/*
 * jQuery Lista Plugin 1.0
 * Requires jQuery 1.4.2
 * 
 * Front View
 * 
 * Uma view padrão para sites Ajax
 *
 * @author Renato Lenz Costalima @ TICE
 * 
 * TODO otimizar a flexibilidade
 * 	definir variáveis para as classes
 * 	pegar os elementos baseados nessas classes
 */
(function($) {
	$.fn.frontView = function(opcoes) {
		var este = this;
		/**
		 * Configurações padrões
		 */
	    var config = {
	    	pInicial: 0,
	    	paginas: this.find('.paginas'),
	    	controles: this.find('.controles'),
	    	menu: this.find('.menu'),
	    	callbackLoad: function(){},
	    	callbackMostraPagina: function () {},
	    	callbackTransicao: function () {}
	    };
		$.extend(config, opcoes);
		/* atributos */ // alguns tem que ser público para permitir alterar as funções
		this.config = config;
		// a página atual
		this.pagina = config.pInicial;
		this.totalPaginas = config.menu.find('li').length;
		
		/* adiciona métodos */
		this.mostraPagina = function(i) {
			// verifica se a página é válida
			if (i < 0) {
				i = this.totalPaginas - 1;
			}
			if (i >= this.totalPaginas) {
				i = 0;
			}
			
			// verifica se já está carregada
			var divPagina = config.paginas.children('.pagina').eq(i);
			if (divPagina.is(':empty')) {
//				divPagina.load(config.menu.find('a')[i].href, function () { config.callbackLoad(divPagina); });
				$.ajax({
					url: config.menu.find('a')[i].href,
					beforeSend: function(){ $('.carregando').show();},
					success: function(retorno){
						$('.carregando').fadeOut();
						divPagina.html(retorno);
						config.callbackLoad(divPagina);
					},
					dataType: 'html'
				});
			}
			// faz a transição
			this.efeitoTransicao(this.pagina, i);
			
			// atualiza a página
			this.pagina = i;
			
			// ativa o menu
			var menus = config.menu.find('a');
			menus.removeClass('selected');
			menus.eq(i).addClass('selected');
    		
    		if (config.callbackMostraPagina != null) {
    			config.callbackMostraPagina(i);
    		}
		};
		this.anterior = function () {
			this.mostraPagina(this.pagina - 1);
		};
		this.proxima = function () {
			this.mostraPagina(this.pagina + 1);		
		};
    	this.efeitoTransicao = function (inicio, fim) {
    		var largura = window.screen.width;
    		var paginas = config.paginas.children('.pagina');
    		pInicial = paginas.eq(inicio);
    		pFinal = paginas.eq(fim);
    		
    		var sentido = (
    			(
    				(inicio < fim) || 
    				((inicio == this.totalPaginas - 1) && (fim == 0))
    			) &&
				!((inicio == 0) && (fim == this.totalPaginas - 1))
    		) ? -1 /* esquerda-direita */ : 1 /* direta-esquerda */;
    		
    		if (inicio == fim) {
        		pFinal.css('left', '0px');
        		pFinal.show();
        		return ;
    		}
    		// define posição inicial para a página final
    		pFinal.css('left', sentido * -1 * largura + 'px');
    		pFinal.show();
    		
    		// liga transição para a posição final de ambas as páginas
    		pInicial.animate({left: sentido * largura + 'px'});
    		pFinal.animate({left: '0px'});
    		
    		if (config.callbackTransicao != null) {
    			config.callbackTransicao(inicio, fim);
    		}
    	};
		
		/* inicializa */
    	// garante que existem páginas para os menus
    	var menus = config.menu.find('li');
    	var divsPagina = config.paginas.children('.pagina');
    	var divsFaltando = menus.length - divsPagina.length;
    	while (divsFaltando > 0) {
    		config.paginas.append('<div class="pagina"></div>');
    		divsFaltando--;
    	}
		// esconde todas as páginas
    	divsPagina.hide();
		// ativa os controles
    	config.controles.find('.proxima').click(function () {
    		este.proxima();
    		return false;
    	});
    	config.controles.find('.anterior').click(function () {
    		este.anterior();
    		return false;
    	});
    	menus.click(function () {
    		este.mostraPagina($(this).index());
    		return false;
    	});
		// mostra a primeira página
    	this.mostraPagina(config.pInicial);

    	return this;
	};
	
})(jQuery);
